package com.pengcheng.jd.task;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.pengcheng.jd.pojo.Item;
import com.pengcheng.jd.service.ItemService;
import com.pengcheng.jd.util.HttpUtils;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

@Component
public class ItemTask {

    @Autowired
    private HttpUtils httpUtils;
    @Autowired
    private ItemService itemService;

    private static final ObjectMapper MAPPER = new ObjectMapper();

    // 当下载任务完成后，间隔多长时间进行下一次的任务。
    @Scheduled(fixedDelay = 100*1000)
    public void itemTask() throws Exception {
        String url = "https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&psort=3&wq=%E6%89%8B%E6%9C%BA&psort=3&ev=exbrand_%E5%8D%8E%E4%B8%BA%EF%BC%88HUAWEI%EF%BC%89%5E";

        // 按照页面对手机搜索结果进行遍历解析
        for (int i = 1; i < 3; i=i+2) {
            String html = httpUtils.doGetHtml(url );

            // 解析页面，获取商品数据并存储
            this.parse(html);
        }

        System.out.println("手机数据抓取完成！");

    }

    // 解析页面，获取商品数据并存储
    private void parse(String html) {
        // 解析html获取 Document
        Document doc = Jsoup.parse(html);

        // 获取spu信息
        Elements spuEles = doc.select("div#J_goodsList > ul > li");

        for (Element spuEle : spuEles) {
            // 获取spu
            if (StringUtils.isBlank(spuEle.attr("data-spu"))) {
                System.out.println("spuEle = " + spuEle);
                continue;
            }
            long spu = Long.parseLong(spuEle.attr("data-spu"));
            // 获取sku信息
            Elements skuEles = spuEle.select("li.ps-item");
            for (Element skuEle : skuEles) {
                // 获取sku
                long sku = Long.parseLong(skuEle.select("[data-sku]").attr("data-sku"));

                // 根据sku查询商品数据
                Item item = new Item();
                item.setSku(sku);
                List<Item> list = itemService.findAll(item);

                if (list.size()>0) {
                    // 如果商品存在，就进行下一个循环，该商品不保存，因为已存在
                    continue;
                }

                // 设置商品的spu
                item.setSpu(spu);

                // 获取商品的详情的url
                String itemUrl = "https://item.jd.com/" + sku + ".html";
                item.setUrl(itemUrl);

                // 获取商品的图片
                String picUrl = "https:" + skuEle.select("img[data-sku]").first().attr("data-lazy-img");
                picUrl = picUrl.replace("/n7/", "/n1/");
                String picName = httpUtils.doGetImage(picUrl);
                item.setPic(picName);

                // 获取商品的价格
                String priceJson = this.httpUtils.doGetHtml("https://p.3.cn/prices/mgets?skuIds=J_" + sku);
                try {
                    double price = MAPPER.readTree(priceJson).get(0).get("p").asDouble();
                    item.setPrice(price);
                } catch (JsonProcessingException e) {
                    e.printStackTrace();
                }

                // 获取商品的标题
                String itemInfo = this.httpUtils.doGetHtml(item.getUrl());
                String title = Jsoup.parse(itemInfo).select("div.sku-name").text();
                item.setTitle(title);

                item.setCreated(new Date());
                item.setUpdated(item.getCreated());

                // 保持商品数据到数据库中
                itemService.save(item);

            }
        }

    }

}
